分页实现

ThinkPHP5.1内置了分页实现,要给数据添加分页输出功能变得非常简单,可以直接在Db类查询的时候调用paginate方法:

  1. // 查询状态为1的用户数据 并且每页显示10条数据
  2. $list = Db::name('user')->where('status',1)->paginate(10);
  3. // 把分页数据赋值给模板变量list
  4. $this->assign('list', $list);
  5. // 渲染模板输出
  6. return $this->fetch();

也可以改成模型的分页查询代码:

  1. // 查询状态为1的用户数据 并且每页显示10条数据
  2. $list = User::where('status',1)->paginate(10);
  3. // 把分页数据赋值给模板变量list
  4. $this->assign('list', $list);
  5. // 渲染模板输出
  6. return $this->fetch();

模板文件中分页输出代码如下:

    • {volist name='list' id='user'}
    • {$user.nickname}
    • {/volist}
  • {$list|raw}
  • 也可以单独赋值分页输出的模板变量

    1. // 查询状态为1的用户数据 并且每页显示10条数据
    2. $list = User::where('status',1)->paginate(10);
    3. // 获取分页显示
    4. $page = $list->render();
    5. // 模板变量赋值
    6. $this->assign('list', $list);
    7. $this->assign('page', $page);
    8. // 渲染模板输出
    9. return $this->fetch();

    模板文件中分页输出代码如下:

      • {volist name='list' id='user'}
      • {$user.nickname}
      • {/volist}
  • {$page|raw}
  • 默认情况下,生成的分页输出是完整分页功能,带总分页数据和上下页码,分页样式只需要通过样式修改即可,完整分页默认生成的分页输出代码为:

    1. class="pagination">
    2. href="?page=1">«
    3. href="?page=1">1
    4. class="active">2
    5. class="disabled">»

    如果你需要单独获取总的数据,可以使用

    1. // 查询状态为1的用户数据 并且每页显示10条数据
    2. $list = User::where('status',1)->paginate(10);
    3. // 获取总记录数
    4. $count = $list->total();
    5. // 把分页数据赋值给模板变量list
    6. $this->assign('list', $list);
    7. // 渲染模板输出
    8. return $this->fetch();

    传入总记录数

    支持传入总记录数而不会自动进行总数计算,例如:

    1. // 查询状态为1的用户数据 并且每页显示10条数据 总记录数为1000
    2. $list = User::where('status',1)->paginate(10,1000);
    3. // 获取分页显示
    4. $page = $list->render();
    5. // 模板变量赋值
    6. $this->assign('list', $list);
    7. $this->assign('page', $page);
    8. // 渲染模板输出
    9. return $this->fetch();

    对于UNION查询以及一些特殊的复杂查询,推荐使用这种方式首先单独查询总记录数,然后再传入分页方法

    分页后数据处理

    支持分页类后数据直接each遍历处理,方便修改分页后的数据,而不是只能通过模型的获取器来补充字段。

    1. $list = User::where('status',1)->paginate()->each(function($item, $key){
    2. $item->nickname = 'think';
    3. });

    如果是Db类操作分页数据的话,each方法的闭包函数中需要使用返回值,例如:

    1. $list = Db::name('user')->where('status',1)->paginate()->each(function($item, $key){
    2. $item['nickname'] = 'think';
    3. return $item;
    4. });

    简洁分页

    如果你仅仅需要输出一个 仅仅只有上下页的分页输出,可以使用下面的简洁分页代码:

    1. // 查询状态为1的用户数据 并且每页显示10条数据
    2. $list = User::where('status',1)->paginate(10,true);
    3. // 把分页数据赋值给模板变量list
    4. $this->assign('list', $list);
    5. // 渲染模板输出
    6. return $this->fetch();

    简洁分页模式的输出代码为:

    1. class="pager">
    2. href="?page=1">«
    3. class="disabled">»

    由于简洁分页模式不需要查询总数据数,因此可以提高查询性能。

    分页参数

    主要的分页参数如下:

    参数 描述
    list_rows 每页数量
    page 当前页
    path url路径
    query url额外参数
    fragment url锚点
    var_page 分页变量
    type 分页类名

    分页参数的设置方式有两种,第一种是在配置文件paginate.php中定义,例如:

    1. //分页配置
    2. return [
    3. 'type' => 'bootstrap',
    4. 'var_page' => 'page',
    5. ];

    type属性支持命名空间,例如:

    1. //分页配置
    2. return [
    3. 'type' => '\org\page\bootstrap',
    4. 'var_page' => 'page',
    5. ];

    也可以在调用分页方法的时候传入,例如:

    1. $list = Db::name('user')->where('status',1)->paginate(10,true,[
    2. 'type' => 'bootstrap',
    3. 'var_page' => 'page',
    4. ]);

    如果需要在分页的时候传入查询条件,可以使用query参数拼接额外的查询参数